﻿Imports StartFrame.BR

Namespace Misc

    Public Class XRMenu

        ''' <summary>
        ''' Retorna el menú solicitado con las opciones habilitadas para el usuario logueado luego de aplicarle la seguridad correspondiente
        ''' </summary>
        ''' <param name="File">Archivo de menú a levantar</param>
        Public Function ObtenerMenu(File As String) As String
            'Obtiene el menú con TODAS las opciones posibles
            Dim sMenu As String = System.IO.File.ReadAllText(File)
            Dim jArray As Newtonsoft.Json.Linq.JArray = Newtonsoft.Json.JsonConvert.DeserializeObject(sMenu)
            Dim aList As New ArrayList

            'Obtiene la configuración de la seguridad
            Dim _abm As New Abm(Common.Env.Operador, Common.Env.Password, "WAACCESOS", "Recorridas.dbo.wld_acceso_programas")
            Dim ds As DataSet = _abm.Buscar()

            'Define una función para aplicar la seguridad configurada para el usuario al menú
            Dim aplicarSeguridad As Action(Of Newtonsoft.Json.Linq.JArray) =
                Sub(jA As Newtonsoft.Json.Linq.JArray)
                    For Each jObject As Newtonsoft.Json.Linq.JObject In jA
                        If jObject.Value(Of Boolean)("leaf") Then
                            'es un nodo hoja (programa)
                            If Not CType(ds.Tables(0).Select(String.Format("cd_grupo_operadores = '{0}' AND nm_programa = '{1}' ", Common.Env.GrupoOperador, jObject.Value(Of String)("programa")))(0)("st_permiso_ing"), Boolean) Then
                                aList.Add(jObject)
                            End If
                        Else
                            'es un submenú
                            aplicarSeguridad(jObject.Value(Of Newtonsoft.Json.Linq.JArray)("children"))
                        End If
                    Next
                End Sub

            'Aplica la seguridad utilizando la función antes definida
            aplicarSeguridad(jArray)
            For Each jo As Newtonsoft.Json.Linq.JObject In aList
                jo.Remove()
            Next

            'Remueve los padres que quedan sin hijos.
            While jArray.Descendants().Any(Function(token) TypeOf (token) Is Newtonsoft.Json.Linq.JObject AndAlso Not token.Value(Of Newtonsoft.Json.Linq.JArray)("children") Is Nothing AndAlso token.Value(Of Newtonsoft.Json.Linq.JArray)("children").Count() = 0)
                jArray.Descendants().ToList().ForEach(Sub(itm) If TypeOf (itm) Is Newtonsoft.Json.Linq.JObject AndAlso Not itm.Value(Of Newtonsoft.Json.Linq.JArray)("children") Is Nothing AndAlso itm.Value(Of Newtonsoft.Json.Linq.JArray)("children").Count() = 0 Then itm.Remove())
            End While

            Return jArray.ToString()

        End Function

    End Class

End Namespace